/*
	kstoneadder.v
	8 bit Kogge-Stone adder
	
	This project and file(s) are released under GNU GPL v3.
	Please find license file from root directory.
	Meng Sun (c) 2013 <leon.meng.sun@gmail.com>
*/

module kstoneadder (A, B, Ci, Y, Co);

input [7:0] A;
input [7:0] B;
input Ci;
output [7:0] Y;
output Co;

wire [7:0] A, B, Y;
wire Ci;
wire Co;

/*G = Qxy[0], P = Qxy[1]*/
wire [1:0] Q77, Q66, Q55, Q44, Q33, Q22, Q11, Q00 /*Q(-1,-1)=Ci*/;
wire [1:0] Q76, Q65, Q54, Q43, Q32, Q21, Q10, Q0_1 /*Q(-1,-1)=Ci*/;
wire [1:0] Q74, Q63, Q52, Q41, Q30, Q2_1, Q1_1 /*Q(-1, -1)=Ci*/;
wire [1:0] Q70, Q6_1, Q5_1, Q4_1, Q3_1 /*Q(-1,-1)=Ci*/;
wire [1:0] Q7_1;/*Final should be Q(x,-1)*/

prep n77 (A[7], B[7], Q77[0], Q77[1]);
prep n66 (A[6], B[6], Q66[0], Q66[1]);
prep n55 (A[5], B[5], Q55[0], Q55[1]);
prep n44 (A[4], B[4], Q44[0], Q44[1]);
prep n33 (A[3], B[3], Q33[0], Q33[1]);
prep n22 (A[2], B[2], Q22[0], Q22[1]);
prep n11 (A[1], B[1], Q11[0], Q11[1]);
prep n00 (A[0], B[0], Q00[0], Q00[1]);

pcell n76 (Q77[1], Q77[0], Q66[1], Q66[0], Q76[1], Q76[0]);
pcell n65 (Q66[1], Q66[0], Q55[1], Q55[0], Q65[1], Q65[0]);
pcell n54 (Q55[1], Q55[0], Q44[1], Q44[0], Q54[1], Q54[0]);
pcell n43 (Q44[1], Q44[0], Q33[1], Q33[0], Q43[1], Q43[0]);
pcell n32 (Q33[1], Q33[0], Q22[1], Q22[0], Q32[1], Q32[0]);
pcell n21 (Q22[1], Q22[0], Q11[1], Q11[0], Q21[1], Q21[0]);
pcell n10 (Q11[1], Q11[0], Q00[1], Q00[0], Q10[1], Q10[0]);
pcell n0_1 (Q00[1], Q00[0], 1'b0, Ci, Q0_1[1], Q0_1[0]);

pcell n74 (Q76[1], Q76[0], Q54[1], Q54[0], Q74[1], Q74[0]);
pcell n63 (Q65[1], Q65[0], Q43[1], Q43[0], Q63[1], Q63[0]);
pcell n52 (Q54[1], Q54[0], Q32[1], Q32[0], Q52[1], Q52[0]);
pcell n41 (Q43[1], Q43[0], Q21[1], Q21[0], Q41[1], Q41[0]);
pcell n30 (Q32[1], Q32[0], Q10[1], Q10[0], Q30[1], Q30[0]);
pcell n2_1 (Q21[1], Q21[0], Q0_1[1], Q0_1[0], Q2_1[1], Q2_1[0]);
pcell n1_1 (Q10[1], Q10[0], 1'b0, Ci, Q1_1[1], Q1_1[0]);

pcell n70 (Q74[1], Q74[0], Q30[1], Q30[0], Q70[1], Q70[0]);
pcell n6_1 (Q63[1], Q63[0], Q2_1[1], Q2_1[0], Q6_1[1], Q6_1[0]);
pcell n5_1 (Q52[1], Q52[0], Q1_1[1], Q1_1[0], Q5_1[1], Q5_1[0]);
pcell n4_1 (Q41[1], Q41[0], Q0_1[1], Q0_1[0], Q4_1[1], Q4_1[0]);
pcell n3_1 (Q30[1], Q30[0], 1'b0, Ci, Q3_1[1], Q3_1[0]);

pcell n7_1 (Q70[1], Q70[0], 1'b0, Ci, Q7_1[1], Q7_1[0]);

assign Y[7] = Q77[1] ^ Q6_1[0];
assign Y[6] = Q66[1] ^ Q5_1[0];
assign Y[5] = Q55[1] ^ Q4_1[0];
assign Y[4] = Q44[1] ^ Q3_1[0];
assign Y[3] = Q33[1] ^ Q2_1[0];
assign Y[2] = Q22[1] ^ Q1_1[0];
assign Y[1] = Q11[1] ^ Q0_1[0];
assign Y[0] = Q00[1] ^ Ci;

assign Co = Q7_1[0];

endmodule
